// 更可读题解  atCoder  412_D
#include <bits/stdc++.h>
using namespace std;

int main() {
  int n, m;
  cin >> n >> m;
  bool f[10][10] = {}; // 原始图的邻接矩阵，初始化为false
  for (int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--; // 转换为0-based索引
    if (u > v)
      swap(u, v);   // 统一存储，保证u < v  只存 邻接矩阵右上角
    f[u][v] = true; // 标记原始图中的边
  }

  int ans = 100;    // 初始化一个大值，用于记录最小修改次数
  vector<int> a(n); // 用于生成排列的数组
  for (int i = 0; i < n; i++)
    a[i] = i; // 初始化排列为0,1,2,...,n-1

  do {
    bool flag = true;
    for (int i = 0; i < n; i++) {
      if (a[i] == i || a[a[i]] == i) {
        flag = false; // 检查是否有自环或重复的情况
        break;        // 跳过自环或重复的情况
      }
    }
    if (!flag)
      continue; // 如果有自环或重复，跳过当前排列
    // 枚举所有顶点排列

    bool g[10][10] = {}; // 目标图的邻接矩阵
    for (int i = 0; i < n; i++) {
      int u = i, v = a[i]; // 环中相邻顶点
      if (u > v)
        swap(u, v);
      g[u][v] = true; // 标记目标图中的边
    }

    int c1 = 0;
    for (int i = 0; i < n; i++)
      for (int j = i; j < n; j++)
        c1 += f[i][j] ^ g[i][j];
    ans = min(ans, c1); // 更新最小修改次数

  } while (next_permutation(a.begin(), a.end())); // 生成下一个排列

  cout << ans << '\n'; // 输出最小修改次数
}
